/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.lang.reflect.ParameterizedType;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;


/**
 * 
 * @author Eduardo
 * @param <T>
 */


public class GeneralDAO<T> implements InterfaceDAO<T> {

    static private EntityManagerFactory emf = Persistence.createEntityManagerFactory("SatacreditoDB");
    
    @PersistenceContext(unitName = "SatacreditoDB")
    protected  EntityManager em;
    
    public GeneralDAO(){
        em = emf.createEntityManager();
    }


    @Override
    public T create(T entity) {
       em.persist(entity); // Crea una nueva tupla en la BD con los datos de "entidad"
                            // -> ademas genera su ID
       return entity;
    }

    @Override
    public T update(T entity) {
       return em.merge(entity);   // Actualiza los datos de "entidad" en su correspondiente tupla BD
    }

    @Override
    public void delete(T entity) {
        em.remove(em.merge(entity));  // Actualiza y elimina
    }

    @Override
    public T searchById(Object id) {
        Class<T> claseEntidad = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
                             // Identifica la clase real de las entidades gestionada por este objeto (T.class)

        return em.find(claseEntidad, id);
    }
}

